---@class GT.ui.control.progress : GT.ui
---@field bar bar 设置进度条当前值
---@field max_value Int32 最大值
---@field bind_attr progress_bind 进度条绑定值
---@field u table<RoleID,GT.ui.control.progress> 玩家独立数据驱动
---@field binding GT.ui.control.progress
GT.ui.control.progress = class(GT.ui, false)


---@class ui_data_progress : ui_data
---@field bar bar 设置进度条当前值
---@field max_value Int32 最大值
---@field bind_attr progress_bind 进度条绑定单位值





---@class progress_bind 绑定单位值
---@field max UnitKeyFloatAttr 最大值
---@field cur UnitKeyFloatAttr 当前值

--- 创建图标
---@param data ui_data_progress
---@return GT.ui.control.progress
function GT.ui.control.progress:ctor(data)
    data.class=GT.ui.control.progress
    if data.uid ~= nil then
        super(self, data)
    else
        data.u_type = GT.ui.type.progress
        self.bar = data.bar
        self.max_value = data.max_value
        self.bind_attr=data.bind_attr
        --创建控件
        super(self, data)
        if self.bar then
            self:set_progress_value(self.bar)
        end

        if self.max_value then
            self:set_max_value(self.max_value)
        end

        if self.bind_attr~=nil then
            self:bind_unit_attr_max(self.bind_attr.max, nil)
            self:bind_unit_attr_cur(self.bind_attr.cur, nil)
        end
    end

    self:progress_watch()
    return self
end

---转对象
---@param data ui_data_progress
---@return GT.ui.control.progress
function GT.ui.control.progress.obj(data)
    return new(GT.ui.control.progress, data)
end

--监听绑定
---@return GT.ui.control.progress
function GT.ui.control.progress:progress_watch()
    ---@type bind_data
    local data = {
        {
            key = "bar",
            func = function(val, old)
                self.bar = val
                self:set_progress_value(self.bar)
            end
        },
        {
            key = "max_value",
            func = function(val, old)
                self.max_value = val
                self:set_max_value(self.max_value)
            end
        },
        {
            key = "bind_attr",
            func = function(val, old)
                self.bind_attr = val
                self:bind_unit_attr_max(self.bind_attr.max, nil)
                self:bind_unit_attr_cur(self.bind_attr.cur, nil)
            end
        },
        
    }
    self.bind:add(data)
    return self
end

---设置进度条当前值
---@param bar bar
function GT.ui.control.progress:set_progress_value(bar)
    game_api.set_progress_bar_current_value(self.player.player , self.uid, bar.progress or 0, Fix32(bar.time) or 0)
end

--- 设置进度条最大值
---@param max_value Float 最大值
function GT.ui.control.progress:set_max_value(max_value)
    game_api.set_progress_bar_max_value(self.player.player , self.uid, max_value)
    return self
end

---绑定单位属性到玩家界面控件的属性 最大值
---@param attr UnitKeyFloatAttr  单位属性
---@param  accuracy integer 小数精度
---@return GT.ui.control.label
function GT.ui.control.progress:bind_unit_attr_max(attr, accuracy)
    self:bind_unit_attribute_to_player_ui_widget_attribute('max_value_bind', attr, accuracy)
end

---绑定单位属性到玩家界面控件的属性 当前值
---@param attr UnitKeyFloatAttr  单位属性
---@param  accuracy integer 小数精度
---@return GT.ui.control.label
function GT.ui.control.progress:bind_unit_attr_cur(attr, accuracy)
    self:bind_unit_attribute_to_player_ui_widget_attribute('current_value_bind', attr, accuracy)
end